package futbolfacil.util;

/*******************************************************************************
 * Copyright 2008 Mjrz.net
 * 
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 * 
 *   http://www.apache.org/licenses/LICENSE-2.0
 * 
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 ******************************************************************************/


import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;
import java.util.GregorianCalendar;
import java.util.TimeZone;

/**
 * @author Mjrz contact@mjrz.net
 *
 */
public class DateUtils {
  public static final String FORMAT_YYYYMMDD = "yyyy-MM-dd";
  public static final String FORMAT_YYYYMMDD_SLASHES = "yyyy/MM/dd";
  public static final String GENERIC_DISPLAY_FORMAT = "E, dd MMM yyyy";
  public static final String TIME_DISPLAY_FORMAT = "HH mm ss";
  public static final int LAST_WEEK = 1;
  public static final int LAST_MONTH = 2;

  public static final String formatDate(Date dt, String format) {
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(dt);
    
    java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(format);
    sdf.setTimeZone(TimeZone.getDefault());     
    return (sdf.format(cal.getTime()));   
  }
  
  public static final String getCurrentDate(String format) {
    Calendar cal = Calendar.getInstance(TimeZone.getDefault());
      java.text.SimpleDateFormat sdf = new java.text.SimpleDateFormat(format);
      sdf.setTimeZone(TimeZone.getDefault());     
      return (sdf.format(cal.getTime()));
  }
  
  public static final String dateToString(Date dt, String dateformat) {
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(dt);
    
    StringBuffer ret = new StringBuffer();
    String separator = new String();
    if(dateformat.equals(DateUtils.FORMAT_YYYYMMDD) ) {
      separator = "-";
    }
    if(dateformat.equals(DateUtils.FORMAT_YYYYMMDD_SLASHES) ) {
      separator = "/";
    }
    ret.append(cal.get(Calendar.YEAR));
    ret.append(separator);
    ret.append(cal.get(Calendar.MONTH) + 1);
    ret.append(separator);
    ret.append(cal.get(Calendar.DATE));

    return ret.toString();
  }
  
  public static final String dateToString(Date dt, String tzString, String dateformat) {
    GregorianCalendar cal = new GregorianCalendar();
    cal.setTime(dt);
    cal.setTimeZone(TimeZone.getTimeZone(tzString));
    
    StringBuffer ret = new StringBuffer();
    String separator = new String();
    if(dateformat.equals(DateUtils.FORMAT_YYYYMMDD) ) {
      separator = "-";
    }
    if(dateformat.equals(DateUtils.FORMAT_YYYYMMDD_SLASHES) ) {
      separator = "/";
    }
    ret.append(cal.get(Calendar.YEAR));
    ret.append(separator);
    ret.append(cal.get(Calendar.MONTH) + 1);
    ret.append(separator);
    ret.append(cal.get(Calendar.DATE));

    return ret.toString();
  }

  public static final String getTimeFromDate(Date dt) {
    Calendar cal = new GregorianCalendar();
    cal.setTime(dt);
    
    StringBuffer ret = new StringBuffer();
    ret.append(cal.get(Calendar.HOUR));
    ret.append(":");
    ret.append(cal.get(Calendar.MINUTE));
    
    return ret.toString();
  }
  
  public static final String getTimeFromDate(Date dt, String tzString) {
    try {
      GregorianCalendar gc = new GregorianCalendar();
      gc.setTime(dt);
      gc.setTimeZone(TimeZone.getTimeZone(tzString));
      StringBuffer ret = new StringBuffer();
      ret.append(gc.get(Calendar.HOUR));
      ret.append(":");
      ret.append(gc.get(Calendar.MINUTE));
      ret.append(" ");
      if(gc.get(Calendar.AM_PM) == 0) {
        ret.append("AM");
      }
      else { 
        ret.append("PM");
      }
      return ret.toString();
    }
    catch(Exception e) {
      return "";
    }
  }
  
  public static final String getDateTimeFromDate(Date dt, String tzString) {
    try {
      GregorianCalendar gc = new GregorianCalendar();
      gc.setTime(dt);
      gc.setTimeZone(TimeZone.getTimeZone(tzString));
      StringBuffer ret = new StringBuffer();
      ret.append(gc.get(Calendar.YEAR));
      ret.append("-");
      ret.append(gc.get(Calendar.MONTH) - 1);
      ret.append("-");
      ret.append(gc.get(Calendar.DATE));
      ret.append(" ");
      ret.append(gc.get(Calendar.HOUR));
      ret.append(":");
      ret.append(gc.get(Calendar.MINUTE));
      ret.append(" ");
      if(gc.get(Calendar.AM_PM) == 0) {
        ret.append("AM");
      }
      else { 
        ret.append("PM");
      }
      return ret.toString();
    }
    catch(Exception e) {
      return "";
    }
  }
  
  public static final String calendarToString(Calendar cal, String dateformat) {
    StringBuffer ret = new StringBuffer();
    if(dateformat.equals(FORMAT_YYYYMMDD) ) {
      ret.append(cal.get(Calendar.YEAR));
      ret.append("-");
      
      String month = null;
      int mo = cal.get(Calendar.MONTH) + 1; /* Calendar month is zero indexed, string months are not */
      if(mo < 10) {
        month = "0" + mo;
      }
      else {
        month = "" + mo;
      }
      ret.append(month);      
      
      ret.append("-");
      
      String date = null;
      int dt = cal.get(Calendar.DATE);
      if(dt < 10) {
        date = "0" + dt;
      }
      else {
        date = "" + dt;
      }
      ret.append(date);
    }
    
    return ret.toString();
  }


  
  public static final GregorianCalendar getCurrentCalendar(String utimezonestring) {
    try {
      GregorianCalendar gc = new GregorianCalendar();

      gc.setTimeZone(TimeZone.getTimeZone(utimezonestring));
      return gc;
    }
    catch(Exception e) {
      //If exception, return server TimeStamp
      return new GregorianCalendar();
    }
  }
  
  public static String[] getDateRange(int cmd) {
    GregorianCalendar gc = new GregorianCalendar();
    GregorianCalendar gc2 = new GregorianCalendar();
    
    SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); //$NON-NLS-1$
    String ret[] = new String[2];
    ret[1] = sdf.format(gc.getTime());
    
    if(cmd == LAST_WEEK) {      
      for(int i = 0; i < 7; i++) {
        gc2.add(Calendar.DATE, -1);
      }
      
    }
    if(cmd == LAST_MONTH) {
      gc2.add(Calendar.MONTH, -1);      
    }
    ret[0] = sdf.format(gc2.getTime());
    return ret;
  }


  public static final String getDayString(int day) {
    switch (day) {
      case Calendar.SUNDAY:
        return "SUNDAY";      
      case Calendar.MONDAY:
        return "MONDAY";
      case Calendar.TUESDAY:
        return "TUESDAY";
      case Calendar.WEDNESDAY:
        return "WEDNESDAY";
      case Calendar.THURSDAY:
        return "THURSDAY";
      case Calendar.FRIDAY:
        return "FRIDAY";
      case Calendar.SATURDAY:
        return "SATURDAY";
    }
    return "";
  }
}


